package edu.upn.sigemfi.sac.bc;

import edu.upn.sigemfi.sac.bc.DocumentoFacadeLocal;
import edu.upn.sigemfi.sac.bc.ProductoSbsFacadeLocal;
import edu.upn.sigemfi.sac.bc.SubProductoFacade;
import edu.upn.sigemfi.sac.bc.SubProductoFacadeLocal;
import edu.upn.sigemfi.sac.be.Documento;
import edu.upn.sigemfi.sac.be.ParametroScoring;
import edu.upn.sigemfi.sac.be.ProductoParametro;
import edu.upn.sigemfi.sac.be.ProductoSbs;
import edu.upn.sigemfi.sac.be.SubProducto;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
 *
 * @author Colao
 */
public class ProductoSbsDelegate {

    private ProductoSbsFacadeLocal local;
    private SubProductoFacadeLocal localSubProducto;
    private DocumentoFacadeLocal documentoLocal;
    private ProductoParametroFacadeLocal productoParametroLocal;

    public ProductoSbsDelegate() {
        local = lookupProductoSbsFacade();
        localSubProducto = lookupSubProductoFacade();
        documentoLocal = lookupDocumentoFacade();
        productoParametroLocal = lookupProductoParametroFacade();
    }

    private SubProductoFacadeLocal lookupSubProductoFacade() {
        try {
            Context c = new InitialContext();
            return (SubProductoFacadeLocal) c.lookup("java:comp/env/SubProductoFacade");
        } catch (NamingException ne) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    private DocumentoFacadeLocal lookupDocumentoFacade() {
        try {
            Context c = new InitialContext();
            return (DocumentoFacadeLocal) c.lookup("java:comp/env/DocumentoFacade");
        } catch (NamingException ne) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    private ProductoSbsFacadeLocal lookupProductoSbsFacade() {
        try {
            Context c = new InitialContext();
            return (ProductoSbsFacadeLocal) c.lookup("java:comp/env/ProductoSbsFacade");
        } catch (NamingException ne) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }


    public ProductoSbs buscar(Long id) throws Exception{
        ProductoSbs prod;
        try{
            prod = local.find(id);
        }catch(Exception ex){
            local = lookupProductoSbsFacade();
            throw new Exception("Buscar ProductosSBS por Id... " + ex.getMessage());
        }
        return prod;
    }

    public SubProducto buscarSubProducto(Long id) throws Exception{
        SubProducto sub;
        try{
            sub = localSubProducto.find(id);
        }catch(Exception ex){
            localSubProducto = lookupSubProductoFacade();
            throw new Exception("Buscar SubProductos por id... " + ex.getMessage());
        }
        return sub;
    }

    public List<ProductoSbs> getProductosSBS() throws Exception{

        List<ProductoSbs> productos;
        try{
            productos = local.findAll();
        }catch(Exception ex){
            local = lookupProductoSbsFacade();
            throw new Exception("Listar ProductosSBS... " + ex.getMessage());
        }
        return productos;
    }

/*
    public List<SubProducto> getSubProductos(Long idProductoSBS) throws Exception{
        List<SubProducto> subs;

        String jpql  ="select p from SubProducto p where p.fidSacProductoSbs.idProductoSbs = " + idProductoSBS.toString();
        try{
            subs = localSubProducto.find(jpql);
        }catch(Exception ex){
            localSubProducto = lookupSubProductoFacade();
            throw new Exception("Listar SubProductos... " + ex.getMessage());
        }
        return subs;
    }
*/

    public void crearDocumento(Documento doc) throws Exception{

        try{
            documentoLocal.create(doc);
        }catch(Exception ex){
            documentoLocal = lookupDocumentoFacade();
            throw new Exception("Buscar ProductosSBS por Id... " + ex.getMessage());
        }
    }

    public void crear(ProductoSbs producto) throws Exception{

        try {
            local.create(producto);
        } catch (Exception ex) {
            local = lookupProductoSbsFacade();
            throw new Exception("Crear ProductoSBS... " + ex.getMessage());
        }
    }


    public void editar(ProductoSbs producto) throws Exception{

        try {
            local.edit(producto);
        } catch (Exception ex) {
            local = lookupProductoSbsFacade();
            throw new Exception("Editar ProductoSBS... " + ex.getMessage());
        }
    }

    public void crearSubProducto(SubProducto subProducto) throws Exception{

        try {
            localSubProducto.create(subProducto);
        } catch (Exception ex) {
            localSubProducto = lookupSubProductoFacade();
            throw new Exception("Crear SubProducto... " + ex.getMessage());
        }
    }

    public void editarSubProducto(SubProducto subProducto) throws Exception{

        try {
            localSubProducto.edit(subProducto);
        } catch (Exception ex) {
            localSubProducto = lookupSubProductoFacade();
            throw new Exception("editar SubProducto... " + ex.getMessage());
        }
    }

    private ProductoParametroFacadeLocal lookupProductoParametroFacade() {
        try {
            Context c = new InitialContext();
            return (ProductoParametroFacadeLocal) c.lookup("java:comp/env/ProductoParametroFacade");
        } catch (NamingException ne) {
            Logger.getLogger(getClass().getName()).log(Level.SEVERE, "exception caught", ne);
            throw new RuntimeException(ne);
        }
    }

    public void crearPP(ProductoParametro pp) throws Exception{

        try {
            productoParametroLocal.create(pp);
        } catch (Exception ex) {
            productoParametroLocal = lookupProductoParametroFacade();
            throw new Exception("Crear Producto Parametro... " + ex.getMessage());
        }
    }

    public void editarPP(ProductoParametro pp) throws Exception{

        try {
            productoParametroLocal.edit(pp);
        } catch (Exception ex) {
            productoParametroLocal = lookupProductoParametroFacade();
            throw new Exception("Editar Producto Parametro... " + ex.getMessage());
        }
    }

    public void eliminarPP(ProductoParametro pp) throws Exception{

        try {
            productoParametroLocal.remove(pp);
        } catch (Exception ex) {
            productoParametroLocal = lookupProductoParametroFacade();
            throw new Exception("Eliminar Producto Parametro... " + ex.getMessage());
        }
    }


}


